/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package cargarDatos;

import java.nio.Buffer;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Arrays;
import java.util.StringTokenizer;

/**
 *
 * @author civilian
 */
public class BufferInsert{

    static final int CAPACIDAD_DEFAULT=50;//topcoder xP
    int _capacidad;
    int _posicion;
    String comiensoInsert;
    StringBuilder comando;
    Statement st;
    
    // debugear la capacidad// ta bien
    public BufferInsert(Statement st,String comiensoInsert) {
        _capacidad=CAPACIDAD_DEFAULT;
        _posicion=0;//cuenta la cantidad de datos que se metieron
        this.st=st;
        this.comiensoInsert=comiensoInsert;
        comando=new StringBuilder();
        comando.append(comiensoInsert);
        
        mostrar=true;
    }
    
    boolean append(String cad) throws SQLException{
        try{
            if(_posicion!=0)
            comando.append(" ,\n");
    //        dbg(cad);
            _posicion++;
            comando.append(cad);
            
            if(_posicion==_capacidad){
                st.executeUpdate(comando.toString());
                reiniciar();
                return true;
            }
        }
        catch(SQLException e){
            esepcion(e);
        }
        
        return false;
    }
    
    void flush() throws SQLException{
        try{
            if(_posicion==0){
                reiniciar();
                return;
            }
            st.executeUpdate(comando.toString());

            reiniciar();
        }
        catch(SQLException e){
            esepcion(e);
        }
    }

    private void esepcion(SQLException e) throws SQLException{
            if(e.getSQLState().equals("23505"))//no toy violando una unique constraint
            {
                if(mostrar)
                System.err.println("restriccion de unicidad violada");
                
                comando.delete(0, comiensoInsert.length());
                
                StringTokenizer tk=new StringTokenizer(comando.toString(), "\n");
                while (tk.hasMoreTokens()) {
                    try {
                        String comando=comiensoInsert+" "+tk.nextToken().replace(") ,",")");
//                        dbg(comando);
                        st.executeUpdate(comando);
                    } catch (SQLException ex) {
                        if(ex.getSQLState().equals("23505"))
                        continue;
                        else throw ex;
                    }
                    
                }
                reiniciar();
            }
            else
                throw e;
    }
    
    private void reiniciar(){
            comando=new StringBuilder(comiensoInsert);//reinicio comando;
            _posicion=0;
    }
    
    boolean mostrar;
    public boolean setMostrarErrores(boolean mostrar){
        this.mostrar=mostrar;
        return true;
    }
    
    @Override
    public String toString() {
        return "BufferInsert{" + ", _posicion=" + _posicion +  ", comando=" + comando + ", st=" + st + '}';
    }

    static  void dbg(Object...o) {
        System.out.println(Arrays.deepToString(o));
    }
}
